#include <stdio.h>

/*
 * 调用函数执行前做的三件事.
 *	1.传递实参,和调用函数所在的下一个地址.
 *	2.为调用函数形参分配内存
 *	3.转到调用函数入口.
 *
 * 返回调用函数做的三件事.
 *	1.保存返回值.
 *	2.清除局部变量.
 *	3.依照被调函数保存的返回地址将控制转移到调用函数
 *
 *	当有多个函数相互调用时,按照"后调用先返回"的原则,函数之间信息传递
 *	必须借助"栈".
 *
 */

int g(int m);

int f(int n)
{
	int val;

	val = g(n);
	return val;
}

int g(int m)
{
	int val;

	val = f(m);
	return val;
}

/* 累加 */
int recusion(int n)
{	
	if ( n == 1 )	// 一定要有个条件,递归才能结束.
		return 1;
	else if ( n == 0 )
		return 0;
	else {
		return  n + recusion(n - 1);
	}
}

/* 阶乘 */
long abc(long a)
{
	if (a == 0 || a== 1)
		return 1;
	else
		return a * abc(a - 1);
}

int fib(int n)
{
	if (n == 1 || n == 2)
		return 1;
	else
		return fib(n - 1) + fib (n - 2);
}

int main()
{
	long int val;
	

	val = recusion(100);
	printf("val = %ld\n", val);

	val = abc(5);
	printf("val = %ld\n", val);

	val = fib(5);
	printf("val = %ld\n", val);

	return 0;
}



